C/C++中关于int *p[n]、int(*p)[n]、int*p()和int(*p)()巨详细实例解释 您所在的位置:网站首页 new int *[n] C/C++中关于int *p[n]、int(*p)[n]、int*p()和int(*p)()巨详细实例解释

C/C++中关于int *p[n]、int(*p)[n]、int*p()和int(*p)()巨详细实例解释

2024-06-16 11:11| 来源: 网络整理| 查看: 265

关于int *p[n]、int(p)[n]、intp()和int(*p)()详细实例解释

指针是C/C++语言中最精彩部分,话不多说,下边对这四种形式进行寻根问底,进行剖析。

int *p[n];int(*p)[n];int*p();int(*p)(); 看似好像乱的不像话,但是它理解起来并没有那么难懂,注意注意,下边是正文部分。

提示:要区分这四个的区别,可以从运算符优先级的层面来看差异,C语言中,[]和()的优先级比 * 的优先级高。

一、int *p[n]

根据优先级,int *p[n]等价于int *(p[n]),那p[n]顾名思义就只是一个数组而已,前边加一个 * ,就变成了数组指针了,即这个一维数组里边n个变量都是指针变量。

数组指针抽象图

这样一来的便捷之处在于可以一次定义很多指针,如果需要很多同类型的指针的话,这么做很省事,事实上确实如此:

测试代码001 #include int main() { int* p[3]; //定义一个指针数组 int* q1, * q2, * q3; //定义三个指针变量 int a = 10, b = 20, c = 30; //定义整型变量,便于后边检验 p[0] = &a; p[1] = &b; p[2] = &c; q1 = &a; q2 = &b; q3 = &c; printf("%d\t%d\t%d\n", *p[0], *p[1], *p[2]); printf("%d\t%d\t%d\n", *q1, *q2, *q3); return 0; }

这里是输出结果: 可以看出:

int *p[n]是定义了一个指针数组,数组中的每一个元素都是一个指针变量每一个数组指针变量都和普通变量没有区别要注意使用数组指针变量时,下标的范围,不要越界 二、int(*p)[n]

到这里,*p不能简单地只看做是 *p=a(假定a是一个整型变量),应该比较着来看: 在这里插入图片描述 int a[3][4]; int (*p)[4]; 第二个式子表示定义了一个指针变量p,p所指的对象是包含4个int型元素的一维数组,可能有点绕,我们来看一下代码:

测试代码002 #include int main() { int a[3][4]={ 1,2,3,4,5,6,7,8,9,10,11,12 }; int(*p)[4]; p = a; //p是一个二维指针,此时指向a[0] p[0][0] = a[0][0]; //p相当于a,但p是一个变量 *(*(p + 1) + 1) = a[1][1]; printf("%d %d\n", p[0][0], *(*(p + 1) + 1)); return 0; }

运行结果是这样的: 在这里插入图片描述 是不是有点明白定义的这个p是什么东西了?是的,你的直觉正确。

int(*p)[4]定义出来的指针p,相当于二维数组a[3][4]的ap指向二维数组a的行a[0]

如果还是不太清楚,我们继续看一段实例代码:

测试代码003 #include int main() { int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; int(*p)[4]; //定义p为指针变量,指向含有4个int型元素的一维数组 int i, j; p = a; //p指向二维数组a的行a[0] for (i = 0; i int s; s = *p + *q; return &s; //返回s的地址 }

运行结果当然也就很明了了,屏幕上蹦出一个9,就结束了,当然,对于这个int*p()讲到这里,最重要的是要记得,这个是 在这里插入图片描述 因为函数返回的类型是指针,所以就叫指针函数咯,这样记还是比较简单的。

四、int(*p)()

对于函数的概念这里就不在多说了,值得一提的是,每个函数都要占用一段连续的存储空间,而函数名就是这段内存区域的首地址,讲到这里,我们其实就可以想,如果把这个首地址赋给一个指针变量,那就可以调用指针来实现函数的功能了,没错,事实就是这样,而这样的函数叫做函数指针(把函数当成一个指针来看),其形式就是int(*p)(), 赶紧上车,看代码去:

在这里插入图片描述

#include int max(int a, int b) //取a,b的最大值 { if (a > b) return a; else return b; } int main() { int a = 1, b = 2; int z; int (*p)(int, int); //定义一个函数指针 p = max; //这个函数指针指向定义的函数 z = (*p)(a, b); printf("%d\n", z); return 0; }

函数指针是比较容易理解的,但在这里要提两点注意的:

函数指针变量不能进行算术运算,这是与数组指针变量不同的,数组指针变量加减一个整数可以使指针移动,但是这里你要是想让函数指针变量移动的话,估计,,,只能说你很有想法函数调用时“(*指针变量名)”两边的括号一定一定不能少,其中的“ * ”不要理解为指针运算,此时的它只是一种指示符号我强调一下,这个是: 在这里插入图片描述 我们再来小小比较一下这两个函数: 形式名称int*p();指针函数int(*p)()函数指针 总结

以上就是本次对C/C++中关于int *p[n]、int(p)[n]、intp()和int(*p)()详细介绍,当然,以上的代码都是用C语言敲写,如果看着难受,也可以用C++咯,那就这样,下次见。

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有